home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #44 (May 89) / Forth Stuff.sit / V5#5 SysEnvirons < prev   
Text File  |  1989-03-15  |  8KB  |  321 lines

  1. \ System configuration cdev 
  2. \ Example for MacTutor written in Mach2 Forth
  3. \ J.Langowski March 1989
  4.  
  5. only forth also mac also assembler
  6.  
  7. \ Define SysEnvirons trap; not present in Mach2.14 release
  8. \ alternatively, use the trap compiler accessible on the
  9. \ GEnie Mach2 libraries
  10.  
  11. .TRAP    _SysEnvirons    $A090
  12.  
  13. 0    CONSTANT    environsVersion
  14. 2    CONSTANT    machineType
  15. 4    CONSTANT    systemVersion
  16. 6    CONSTANT    processor
  17. 8    CONSTANT    hasFPU
  18. 9    CONSTANT    hasColorQD
  19. 10    CONSTANT    keyBoardType
  20. 12    CONSTANT    atDrvrVersNum
  21. 14    CONSTANT    sysVRefNum
  22.  
  23. \ compiler support words for kernel-independent definitions,
  24. \ defproc resources, etc.
  25. \ :xdef compiles a JMP at the beginning of the
  26. \ block, which is resolved at the end of the definition
  27. \ by ;xdef.
  28.  
  29. : :xdef ( -- branch marker )
  30.     create     -4 allot
  31.         $4EFA w, ( JMP )
  32.         0 w,     ( entry point to be filled later )
  33.         0 ,      ( length of routine to be filled later )
  34.         here 6 - 76543 ( marker for stack checking )
  35. ;
  36.  
  37. : ;xdef { branch marker entry | -- }
  38.     marker 76543 <> abort" xdef mismatch"
  39.     entry branch - branch w!
  40.     here branch - 2+ branch 2+ !
  41.     
  42. : xlen 4 + @ ; ( get length word of external definition )
  43.  
  44. \ **** cdev proc glue macros for kernel-independent code
  45.  
  46. CODE cdev.prelude
  47.     LINK    A6,#-512         ( 512 bytes of local Forth stack )
  48.     MOVEM.L    A0-A5/D0-D7,-(A7)    ( save registers )
  49.     MOVE.L    A6,A3            ( setup local loop return stack )
  50.     SUBA.L    #256,A3            ( in the low 256 local stack bytes )
  51.     MOVE.L    8(A6),D0         ( CPDialog )
  52.     MOVE.L    12(A6),D1         ( cdevValue )
  53.     MOVE.L    16(A6),D2         ( theEvent )
  54.     CLR.L    D3
  55.     MOVE.W    20(A6),D3         ( CPanelID )
  56.     EXT.L    D3            ( in case this is negative )
  57.     CLR.L    D4
  58.     MOVE.W    22(A6),D4         ( numItems )
  59.     CLR.L    D5
  60.     MOVE.W    24(A6),D5         ( Item )
  61.     CLR.L    D6
  62.     MOVE.W    26(A6),D6         ( message )
  63.     MOVE.L    D6,-(A6)
  64.     MOVE.L    D5,-(A6)
  65.     MOVE.L    D4,-(A6)
  66.     MOVE.L    D3,-(A6)
  67.     MOVE.L    D2,-(A6)
  68.     MOVE.L    D1,-(A6)
  69.     MOVE.L    D0,-(A6)
  70.     RTS            \ just to indicate the MACHro stops here 
  71. END-CODE MACH
  72.  
  73. CODE cdev.epilogue ( resCode -- )
  74.     MOVE.L    (A6)+,D0
  75.     MOVE.L    D0,28(A6)        ( store function result )
  76.     MOVEM.L (A7)+,A0-A5/D0-D7    ( restore registers )
  77.     UNLK    A6
  78.     MOVE.L    (A7)+,A0        ( return address )
  79.     ADD.W    #20,A7            ( pop off 20 bytes of parameters )
  80.     JMP    (A0)
  81.     RTS
  82. END-CODE MACH
  83.  
  84. \ the actual cdev code starts here.
  85. \ REMEMBER: don't use CALL for the toolbox routines;
  86. \ use (CALL) instead, which is not dependent on D4 
  87. \ pointing to a correct stack.
  88.  
  89. :xdef myCdev
  90.  
  91. \ just to put some text into the resource
  92. \ for easier identification
  93.  
  94. : start " Mach2 Forth cdev example, JL/MacTutor 1989" ;
  95.  
  96. CODE SysEnvirons ( theWorld versrequested -- theWorld resCode )
  97.     MOVEA.L    4(A6),A0
  98.     MOVE.L    (A6)+,D0
  99.     ADDQ.L    #4,A6
  100.     _SysEnvirons
  101.     MOVE.L    A0,-(A6)
  102.     EXT.L    D0
  103.     MOVE.L    D0,-(A6)
  104.     RTS
  105. END-CODE
  106.  
  107. \ words which extract single items from the SysEnvRec
  108.  
  109. : ?mach { | [ 12 lallot ] sysEnvRec -- machine# }
  110.     ^ sysEnvRec 1 SysEnvirons drop 2+ w@ ;
  111.  
  112. : ?sys { | [ 12 lallot ] sysEnvRec -- system# revision# }
  113.     ^ sysEnvRec 1 SysEnvirons drop 
  114.         dup 5 + c@  swap 4+ c@ ;
  115.  
  116. : ?proc { | [ 12 lallot ] sysEnvRec -- machine# }
  117.     ^ sysEnvRec 1 SysEnvirons drop 6 + w@ ;
  118.  
  119. : ?fpu { | [ 12 lallot ] sysEnvRec -- machine# }
  120.     ^ sysEnvRec 1 SysEnvirons drop 8 + c@ ;
  121.  
  122. : ?colorQD { | [ 12 lallot ] sysEnvRec -- machine# }
  123.     ^ sysEnvRec 1 SysEnvirons drop 9 + c@ ;
  124.  
  125. : ?keyType { | [ 12 lallot ] sysEnvRec -- machine# }
  126.     ^ sysEnvRec 1 SysEnvirons drop 10 + w@ ;
  127.  
  128. : ?atkVers { | [ 12 lallot ] sysEnvRec -- machine# }
  129.     ^ sysEnvRec 1 SysEnvirons drop 12 + w@ ;
  130.  
  131. : ?sysVRef { | [ 12 lallot ] sysEnvRec -- machine# }
  132.     ^ sysEnvRec 1 SysEnvirons drop 14 + w@ l_ext ;
  133.  
  134. \ factored out the GetDItem/SetIText stuff
  135.  
  136. : set.item ( string dlgPtr #item ) { | type hItem box -- }
  137.     ^ type ^ hItem ^ box (call) GetDItem
  138.     hItem swap (call) SetIText ;
  139.  
  140. \ display system characteristics 
  141. \ in the cdev dialog box (DITL -4064 resource dependent)
  142. \ the strings are hard-coded, but could as well be contained 
  143. \ in a STR# resource
  144.  
  145. : display.it {  numItems dlgPtr | [ 16 lallot ] str1 -- }
  146.     ?mach CASE 
  147.         0 OF " unknown" ENDOF
  148.         1 OF " Mac 512KE" ENDOF
  149.         2 OF " Mac Plus" ENDOF
  150.         3 OF " Mac SE" ENDOF
  151.         4 OF " Mac II" ENDOF
  152.         5 OF " Mac IIx" ENDOF
  153.     \ wasn't sure whether machine=6 is the new baby MacII,
  154.     \ so left out that case
  155.         7 OF " Mac SE/030" ENDOF
  156.         " NEW MACHINE"
  157.     ENDCASE     dlgPtr 3 numItems + set.item
  158.  
  159.     \ get system version # and convert to string, format X.XX 
  160.     \ if you don't know Forth, this might be hard to read :-)
  161.     ?sys 
  162.         ^ str1 swap (call) numtostring 
  163.         dup c@ 1+ + swap (call) numtostring 
  164.         dup c@ 1 = IF dup 1+ c@ over 2+ c! 
  165.                     dup 1+ ascii 0 swap c! THEN
  166.         ascii . swap c!  
  167.         ^ str1 dup c@ 3 + swap c!
  168.     ^ str1 dlgPtr 5 numItems + set.item 
  169.  
  170.     ?proc CASE
  171.         0 OF " unknown" ENDOF
  172.         1 OF " 68000" ENDOF
  173.         2 OF " 68010" ENDOF
  174.         3 OF " 68020" ENDOF
  175.         4 OF " 68030" ENDOF
  176.         " NEW"
  177.     ENDCASE dlgPtr 7 numItems + set.item
  178.  
  179.     ?fpu IF " yes" ELSE " none" THEN
  180.         dlgPtr 9 numItems + set.item 
  181.  
  182.     ?colorQD IF " yes" ELSE " no" THEN
  183.         dlgPtr 11 numItems + set.item 
  184.  
  185.     ?keyType CASE 
  186.         0 OF " unknown type" ENDOF
  187.         1 OF " 'old' Macintosh keyboard" ENDOF
  188.         2 OF " 'old' Macintosh keyboard with keypad" ENDOF
  189.         3 OF " Macintosh Plus keyboard" ENDOF
  190.         4 OF " Apple Desktop Bus extended keyboard" ENDOF
  191.         5 OF " Apple Desktop Bus standard keyboard" ENDOF
  192.         " something NEW" 
  193.     ENDCASE dlgPtr 13 numItems + set.item 
  194.  
  195.     ^ str1 ?atkVers (call) numtostring
  196.         dlgPtr 15 numItems + set.item 
  197. ;
  198.     
  199. : testCdev { message item numItems CPanelID
  200.              theEvent cdevValue CPDialog -- result }
  201.     \ we only need to respond to the initDev message
  202.     \ by putting the system configuration info
  203.     \ into the cdev's dialog items
  204.     message CASE
  205.         0 OF ( initDev ) 1 (call) sysbeep 
  206.             numItems CPDialog display.it ENDOF
  207.         ( insert handlers for other messages here)
  208.     ENDCASE
  209.     cdevValue \ everything OK: return old cdevValue
  210. ;
  211.  
  212. : cdev.glue 
  213.     cdev.prelude
  214.     testCdev
  215.     cdev.epilogue
  216. ;
  217.  
  218. ' cdev.glue ;xdef
  219.  
  220. \ end of cdev code
  221.  
  222.  
  223. \ making the cdev resource, the usual way
  224.  
  225. : $create-res call CreateResFile call ResError L_ext ;
  226.  
  227. : $open-res { addr | refNum -- result }
  228.     addr call openresfile -> refNum
  229.     call ResError L_ext
  230.     dup not IF drop refNum THEN 
  231. ;
  232.  
  233. : $close-res call CloseResFile call ResError L_ext ;
  234.  
  235. : make-cdev { | refNum -- }
  236.     " cdev.res" dup $create-res
  237.     abort" You have to delete the old 'cdev.res' file first."
  238.     $open-res dup -> refNum call UseResFile 
  239.     ['] myCdev dup xlen
  240.         call PtrToHand drop ( result code )
  241.         ASCII cdev -4064 " cdev JL" call AddResource
  242.     refNum $close-res drop ( result code )
  243. ;
  244.  
  245. \ End of cdev creation code.
  246. \ Following are some words that can be executed 
  247. \ from within the Mach2 system, and output system configuration
  248. \ information directly to the console.
  249.      
  250. : myMachine cr ." This is a"
  251.     ?mach CASE
  252.         0 OF ." n unknown machine," ENDOF
  253.         1 OF ."  Mac 512KE," ENDOF
  254.         2 OF ."  Mac Plus," ENDOF
  255.         3 OF ."  Mac SE," ENDOF
  256.         4 OF ."  Mac II," ENDOF
  257.         5 OF ."  Mac IIx," ENDOF
  258.         7 OF ."  Mac SE/030," ENDOF
  259.         ."  NEW MACHINE,"
  260.     ENDCASE
  261. ;
  262.  
  263.  
  264. : mySystem ?sys
  265.     ."  running system v. " 
  266.     <# # #> type ascii . emit 
  267.     <# # # #> type ascii . emit
  268. ;
  269.  
  270. : myProcessor cr ." It uses a"
  271.     ?proc CASE
  272.         0 OF ." n unknown" ENDOF
  273.         1 OF ."  68000" ENDOF
  274.         2 OF ."  68010" ENDOF
  275.         3 OF ."  68020" ENDOF
  276.         4 OF ."  68030" ENDOF
  277.         ."  NEW"
  278.     ENDCASE
  279.     ."  processor"
  280. ;
  281.  
  282. : myFPU ?fpu IF
  283.       ascii , emit cr 
  284.       ." and has an arithmetic coprocessor installed." 
  285.     ELSE
  286.       ascii . emit
  287.     THEN
  288. ;
  289.  
  290. : myCQD cr ." Color QuickDraw is "
  291.     ?colorQD 0= IF ." not " THEN
  292.     ." available."
  293. ;
  294.  
  295. : myKeyBoard cr ." The Keyboard is "
  296.     ?keyType CASE 
  297.         0 OF ." of an unknown type." ENDOF
  298.         1 OF ." the 'old' Macintosh type." ENDOF
  299.         2 OF ." the 'old' Macintosh type with keypad." ENDOF
  300.         3 OF ." the Mac Plus type." ENDOF
  301.         4 OF ." the ADB extended type." ENDOF
  302.         5 OF ." the standard ADB type." ENDOF
  303.         ." a NEW type." 
  304.     ENDCASE
  305. ;
  306.  
  307. : myAtkDrvr cr ." Appletalk v. " ?atkVers . 
  308.     ." is installed."
  309. ;
  310.  
  311. : machTest 
  312.     myMachine mySystem 
  313.     myProcessor myFPU
  314.     myCQD
  315.     myKeyBoard
  316.     myAtkDrvr
  317.     cr
  318. ;
  319.  
  320.